package br.usjt.mazerobot.pc.comunicacao;

import br.usjt.mazerobot.commons.comunicacao.Pacote;
import br.usjt.mazerobot.commons.constante.IdentificadorPacote;
import br.usjt.mazerobot.pc.util.Logger;
import br.usjt.mazerobot.pc.util.PropertiesUtil;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Properties;

public class ComunicadorSocket implements Comunicador {

    private Logger logger = new Logger();
    private final int PORTA_ENTRADA = 2000;
    private final int PORTA_SAIDA = 3000;
    private String IP_DESTINO;
    
    //Variaveis para o metodo receber
    private byte[] buf;
    private DatagramSocket datagramSocket;
    private DatagramPacket datagramPacket;

    public ComunicadorSocket() {
        try {
            Properties loadProperties = PropertiesUtil.loadProperties("Configuracao.properties");
            IP_DESTINO = loadProperties.getProperty("ip_robo");
            buf = new byte[16];
            datagramSocket = new DatagramSocket(PORTA_ENTRADA);
            datagramPacket = new DatagramPacket(buf, buf.length);
        } catch (IOException ex) {
            logger.erro(ex.getMessage());
        }
    }

    @Override
    public void desconectar() {
        logger.imprime("desconectando...");
    }

    @Override
    public void enviar(Pacote pacote) {
        try {
            logger.imprime("enviando pacote " + IdentificadorPacote.fromValue(pacote.getCabecalho()).name());
            InetAddress inetAddress = InetAddress.getByName(IP_DESTINO);
            
            DatagramSocket datagramSocketOutput = new DatagramSocket();
            DatagramPacket datagramPacketOutput = new DatagramPacket(pacote.getDados(), pacote.getDados().length, inetAddress, PORTA_SAIDA);
            datagramSocketOutput.send(datagramPacketOutput);
        } catch (IOException ex) {
            logger.erro(ex.getMessage());
        }
    }

    @Override
    public Pacote receber() {
        try {
            logger.imprime("Aguardando pacote...");
            datagramSocket.receive(datagramPacket);
            Pacote pacote = (Pacote) new Pacote(datagramPacket.getData());
            return pacote;
        } catch (IOException ex) {
            logger.erro(ex.getMessage());
        }
        return null;
    }

    @Override
    public boolean conectar() {
        return true;
    }
}
